package com.dxy.netty.websocket;

import com.alibaba.fastjson.JSON;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.FullHttpRequest;

import java.util.HashMap;
import java.util.Map;

/**
 * @Description 鉴权handler
 * @Author dangxianyue
 * @Date 2023/1/8 12:17
 */
public class ChannelAuthHandler extends SimpleChannelInboundHandler<FullHttpRequest> {

    //在建立连接的时候在中途给他截下来参数，然后把参数去掉接着执行。
    @Override
    public void channelRead0(ChannelHandlerContext ctx, FullHttpRequest request) throws Exception {
        String uri = request.uri();
        System.out.println("连接uri: " + uri);
        Map paramMap = getUrlParams(uri);
        System.out.println("接收到的参数是：" + JSON.toJSONString(paramMap));

        //可以通过配置的形式，简单地验证token，列如
        if("a7f324be2fb7".equals(paramMap.get("token").toString())) {
            System.out.println("鉴权通过");

            //注意这里一定要去掉参数，重新设置连接
            request.setUri(NettyWebSocketServer.URI);

            // 传递到下一个handler：升级握手
            ctx.fireChannelRead(request.retain());
            // 在本channel上移除这个handler消息处理，即只处理一次，鉴权通过与否
            ctx.pipeline().remove(ChannelAuthHandler.class);

        } else {
            System.out.println("token校验失败！");
            ctx.close();
        }

    }

    private static Map getUrlParams(String url) {
        Map<String, String> map = new HashMap<>();
        url = url.replace("?", ";");
        if (!url.contains(";")) {
            return map;
        }
        if (url.split(";").length > 0) {
            String[] arr = url.split(";")[1].split("&");
            for (String s : arr) {
                String key = s.split("=")[0];
                String value = s.split("=")[1];
                map.put(key, value);
            }
            return map;

        } else {
            return map;
        }
    }
}

